package com.hsylient.javase.draftpaper;

import cn.hutool.core.collection.ListUtil;
import lombok.extern.slf4j.Slf4j;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.util.List;

@Slf4j
public class NumberFormatter {
    public static String formatToCompactCurrency(BigDecimal value) {
        if (value.compareTo(BigDecimal.valueOf(1000)) < 0) {
            // 小于 1000，直接格式化为 $1,234.56
            DecimalFormat df = new DecimalFormat("$#,###.00");
            return df.format(value.doubleValue());
        }

        String[] units = {"", "K", "M", "G"}; // 最大单位到 G（十亿）
        int unitIndex = (int) (Math.log10(value.doubleValue()) / 3);
        unitIndex = Math.min(unitIndex, 3); // 限制单位不超过 G
        BigDecimal divisor = BigDecimal.valueOf(Math.pow(1000, unitIndex));
        BigDecimal scaledValue = value.divide(divisor, 2, RoundingMode.HALF_UP);

        // 格式化整数部分（添加逗号），小数部分保留 2 位
        DecimalFormat df = new DecimalFormat("$#,###.00");
        return df.format(scaledValue) + units[unitIndex];
    }


    public static void main(String[] args) {
        List<BigDecimal> decimals = ListUtil.of(
                new BigDecimal("0"),
                new BigDecimal("10"),
                new BigDecimal("10.67812313213123"),
                new BigDecimal("10.67212313213123"),
                new BigDecimal("1000"),
                new BigDecimal("1000.59232"),
                new BigDecimal("1234.59232"),
                new BigDecimal("1235.59232"),
                new BigDecimal("1000000"),
                new BigDecimal("7654321"),
                new BigDecimal("1000000000"),
                new BigDecimal("1000000000000"),
                new BigDecimal("100000666000000")
        );
        decimals.forEach(item -> log.info("[{}] =========> [{}]", item, formatToCompactCurrency(item)));
    }
}